package hdb.dao;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;


import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import hdb.dto.EinkaufslisteDTO;
import hdb.om.Artikel;
import hdb.om.Vorrat;
import hdb.om.LagerTyp;

/**
 * The Data access class for stock. All Interaction with the database
 * regarding the entity bean Vorrat should be handled by this class!
 * @author juergen.schoenwaelder@stud.fh-deggendorf.de, 
 * 			thomas.eberhart@stud.fh-deggendorf.de
 */
public class VorratDao extends HibernateDaoSupport {
	SimpleDateFormat deutschesDatumsFormat = new SimpleDateFormat("dd.MM.yyyy hh:mm");

		/**
		 * returns a single stock by its primary db key
		 * @param id
		 * @return a single Vorrat
		 */
		public Vorrat findById(int id) {
			HibernateTemplate template = getHibernateTemplate();
			return (Vorrat) template.get(Vorrat.class, id);
		}
		
		/**
		 * Returns all items from the database.
		 * @return a list of Vorrat
		 * @see Vorrat
		 */
		@SuppressWarnings("unchecked")
		public List<Vorrat> findAll() {
			HibernateTemplate template = getHibernateTemplate();
			
//			SessionFactory hibernateSessionFactory = template.getSessionFactory();
//			Session sess = hibernateSessionFactory.getCurrentSession();
//			SQLQuery sqlQuery = sess.createSQLQuery("SELECT * FROM vorrat");
//			List vorrat = sqlQuery.list();
			
//			Criteria crit = sess.createCriteria(Vorrat.class);
//			List vorrat = crit.list();
//			return vorrat;
			
			return template.loadAll(Vorrat.class);
		}

		/**
		 * modifies an existing item in the database which is selected by its primary key.
		 * @param id the primary key of the stock
		 * @param name the new name for the item
		 * @see Vorrat
		 */
		public void modify(int id, int artikelId, int lagertypId, int anzahl) {
			HibernateTemplate template = getHibernateTemplate();			
			Vorrat vorrat = (Vorrat) template.get(Vorrat.class, id);
			Artikel a = (Artikel) template.get(Artikel.class, artikelId);
			LagerTyp lagertyp = (LagerTyp) template.get(LagerTyp.class, lagertypId);
			vorrat.setAnzahl(anzahl);
			vorrat.setLagertyp(lagertyp);
			vorrat.setArtikel(a);
			template.saveOrUpdate(vorrat);
		}
		
		/**
		 * Create a stock specifying a Artikel id and a specifying LagerTyp id.
		 * @param artikelId
		 * @param lagertypId
		 * 
		 */
//		public void anlegen(int artikelId, Set<Integer> lagertypIds) {
//			HibernateTemplate template = getHibernateTemplate();
//			Artikel a = (Artikel) template.get(Artikel.class, artikelId);
//			Set<LagerTyp> lagertyp = new HashSet<LagerTyp>();
//			for(Integer lagertypId : lagertypIds) {
//				lagertyp.add((LagerTyp) template.get(LagerTyp.class, lagertypId));
//			}
//			Vorrat v = new Vorrat();
//			v.setArtikel(a);
//			v.setLagertyp(lagertyp);
//			template.saveOrUpdate(v);
//		}
		
		public void anlegen(int artikelId, int lagertypId, int anzahl) {
			HibernateTemplate template = getHibernateTemplate();
			Artikel a = (Artikel) template.get(Artikel.class, artikelId);
			LagerTyp lagertyp = (LagerTyp) template.get(LagerTyp.class, lagertypId);			
			
			Vorrat v = new Vorrat();
			v.setArtikel(a);
			v.setLagertyp(lagertyp);
			v.setAnzahl(anzahl);
			template.saveOrUpdate(v);
		}		
		
/*
		*//**
		 * returns the list of items which are currently on a purchase list.
		 * @return a List of Artikel
		 *//*
		@SuppressWarnings("unchecked")
		public List<Artikel> findFreie() {
			HibernateTemplate template = getHibernateTemplate();
			List<Fahrt> aktuelleFahrten = template.find("from Fahrt f where f.ankunft is null");
			List<Artikel> alle = template.loadAll(Artikel.class);
			List<Artikel> result = new LinkedList<Artikel>();
			List<Artikel> belegteBoote = new LinkedList<Artikel>();
			for (Fahrt fahrt : aktuelleFahrten) {
				belegteBoote.add(fahrt.getBoot());
			}
			for (Artikel artikel : alle) {
				if (!belegteBoote.contains(artikel)) {
					result.add(artikel);
				}
			}
			return result;
		}
*/
		/**
		 * deletes a stock using it's id.
		 * @param id
		 * @throws VorratDeleteException if there are Vorrat objects involving the item.
		 */
		public void deleteById(int id) throws VorratDeleteException {
			HibernateTemplate template = getHibernateTemplate();
			Vorrat v = findById(id);
//			Set<Vorrat> vorrat = v.getVorrat();
//			if ((vorrat == null) || (vorrat.size() == 0)) {
				template.delete(v);
//			} else {
//				throw new ArtikelDeleteException();
//			}
		}
		public Set<Vorrat> findByArtikel(Artikel artikel) {
			List<Vorrat> vorraete = findAll();
			Set<Vorrat> result = new HashSet<Vorrat>();
			for (Vorrat v : vorraete) {
				if (v.getArtikel().equals(artikel)) {
					result.add(v);
				}
			}
			return result;
		}
		public Set<Vorrat> findByLagerTyp (LagerTyp lagertyp) {
			List<Vorrat> vorraete = findAll();
			Set<Vorrat> result = new HashSet<Vorrat>();
			for (Vorrat v : vorraete) {
				if (v.getLagertyp().equals(lagertyp)) {
					result.add(v);
				}
			}
			return result;
		}
}
